package com.demo.config.apache.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

/**
 * 文件、文件夹操作 ⅰ. 单个复制文件的方法-复制文件到新文件夹中并修改后缀 -全路径 包含文件名称 ⅱ. 批量复制文件的方法-复制文件到新文件夹中并修改后缀 -全路径
 * 包含文件名称 ⅲ. 批量修改当前文件下的名称及后缀
 */
public class FileUtil {

	/**
	 * 文件层级 单个复制文件的方法-复制文件到新文件夹中并修改后缀 -全路径 包含文件名称
	 * @param oldPath 旧路径具体文件地址 D:/sd/df/11.doc
	 * @param newPath 新路径具体文件地址 D:/sd/df/11.docx
	 */
	public static void copyFileSuffix(String oldPath, String newPath) throws IOException {
		FileChannel sourceFile = new FileInputStream(oldPath).getChannel();
		FileChannel copiedFile = new FileOutputStream(newPath).getChannel();

		// 参数一：原通道 参数二：文件中开始传输的位置 参数三：要传输的最大字节数
		copiedFile.transferFrom(sourceFile, 0, sourceFile.size());
		sourceFile.close();
		copiedFile.close();

	}

	/**
	 * 文件夹层级 批量复制文件的方法-复制文件到新文件夹中并修改后缀 -全路径 包含文件名称
	 * @param oldPath 旧文件夹地址
	 * @param newPath 新文件夹地址
	 * @param oldSuffix 修改前后缀 .doc
	 * @param newSuffix 修改后后缀 .docx
	 */
	public static void copyFilesSuffix(String oldPath, String newPath, String oldSuffix, String newSuffix)
			throws IOException {
		FileChannel sourceFile = null;
		FileChannel copiedFile = null;

		File file = new File(oldPath);
		// 返回一个字符串数组，得到文件夹下的所有文件和文件夹
		String[] list = file.list();

		// 如果该文件夹存在且不为空
		if (list != null) {
			for (String childName : list) {
				File oldFile = new File(oldPath, childName);
				// 判断是文件还是文件夹
				if (!oldFile.isDirectory()) {
					// 是文件则判断是不是要复制的的
					if (childName.contains(oldSuffix)) {
						try {
							sourceFile = new FileInputStream(oldFile).getChannel();
							copiedFile = new FileOutputStream(
									newPath + "/" + childName.substring(0, childName.lastIndexOf(".")) + newSuffix)
											.getChannel();
							/**
							 * 参数一：原通道 参数二：文件中开始传输的位置 参数三：要传输的最大字节数
							 */
							copiedFile.transferFrom(sourceFile, 0, sourceFile.size());
						}
						catch (IOException e) {
							e.printStackTrace();
						}
						finally {
							sourceFile.close();
							copiedFile.close();
						}

					}
				}
				else {
					// 是文件夹则进行迭代
					String nextPath = oldPath + "/" + childName;
					copyFilesSuffix(nextPath, newPath, oldSuffix, newSuffix);
				}
			}
		}
	}

	/**
	 * 文件夹层级
	 * <p>
	 * 批量修改当前文件下的名称及后缀
	 * @param path 文件地址-文件目录或者文件具体位置
	 * @param oldSuffix 修改前后缀 .doc
	 * @param newSuffix 修改后后缀
	 */
	public static void updFilesSuffix(String path, String oldSuffix, String newSuffix) {
		File file = new File(path);
		// 返回一个字符串数组，得到文件夹下的所有文件和文件夹
		String[] list = file.list();

		// 如果该文件夹存在且不为空
		if (list != null) {
			for (String oldName : list) {
				File oldFile = new File(path, oldName);
				// 判断是文件还是文件夹
				if (!oldFile.isDirectory()) {
					// 是文件则判断是不是要修改的
					if (oldName.contains(oldSuffix)) {
						System.out.print("修改前名称：" + oldName + "\t");
						String newName = oldName.substring(0, oldName.lastIndexOf(".")) + newSuffix;
						System.out.println("修改后名称：" + newName);
						File newFile = new File(path, newName);
						// 重命名这个路径的文件
						boolean flag = oldFile.renameTo(newFile);
						// 修改成功返回true，否则返回false
						System.out.println(flag);
					}
				}
				else {
					// 是文件夹则进行迭代
					String newPath = path + "/" + oldName;
					updFilesSuffix(newPath, oldSuffix, newSuffix);
				}
			}
		}
	}

}
